大家好~
今天要來使用 Laravel Sanctum 實作會員系統!
使用 php artisan make:controller
建立一個 AuthController。
在剛剛建立的 AuthController 內 use App\Models\User
與其他會用到的 class。
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Response;
是個人習慣,
該 class extends vendor/symfony/http-foundation/Response.php
,vendor/symfony/http-foundation/Response.php
內定義了 HTTP Status Code 常量。
下圖為 vendor/symfony/http-foundation/Response.php
內部分截圖。
public function register(Request $request)
{
$validated = $request->validate([
'name' => 'required|string',
'email' => 'required|email|unique:users,email',
'password' => 'required|string|min:8',
]);
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email'],
'password' => Hash::make($validated['password'])
]);
$token = $user->createToken('token')->plainTextToken;
return [
'user' => $user,
'token' => $token
];
}
Laravel Validation 提供許多驗證規則使我們可以輕鬆的對 Request 內的表單驗證。
Laravel 預設會是使用 bcrypt 做 hash。
Laravel 支援 bcrypt、argon、argon2id,
可以在 config/hashing.php
做變更。vendor/laravel/framework/src/Illuminate/Hashing/HashManager.php
使用 HasApiTokens 這個 trait 內的 createToken() 為 user 建立 token。
下圖是 createToken() 的原始碼。
使用 plainTextToken 可以調用未 hash 前的 token。
public function login(Request $request)
{
$validated = $request->validate([
'email' => 'required|email',
'password' => 'required|string|min:8'
]);
$user = User::where('email', $validated['email'])->first();
if (!$user || !Hash::check($validated['password'], $user['password'])) {
return response([
'message' => 'The provided credentials are incorrect.'
], Response::HTTP_UNAUTHORIZED);
}
$token = $user->createToken('apiToken')->plainTextToken;
return response([
'user' => $user,
'token' => $token
], Response::HTTP_CREATED);
}
使用 Hash::check() 將 Request 內的 password 與 資料庫內 Hash 過的 password 進行比對。
第一個參數為未 hash 的,
第二個參數為已 hash 過的。vendor/laravel/framework/src/Illuminate/Hashing/HashManager.php
public function logout()
{
Auth::user()->tokens()->delete();
return response([
'message' => 'Logged out.'
],Response::HTTP_OK);
}
Auth::user() 可以取得已認證的 User,
然後使用 HasApiTokens trait 提供的 tokens 關聯關係從數據庫刪除 token。
那麼會員的註冊、登入、登出就完成了!
明天再來幫會員系統設定 Routes 並且用 Postman 測試會員系統吧!
大家明天見啦~
若文章有任何問題,
還請大家不吝賜教!